\section{Diseño}

Se presentan a continuaci\'on un conjunto de diseño de objetos, que 
intentan dar una soluci\'on al problema presentado por la c\'atedra.

\paragraph{Nota} 
Todos los diagramas presentados se encuentran en tambi\'en en el 
entregable dentro de la carpeta \texttt{/diagramas}.

\subsection{Diagramas de Objetos}

Muchos de los objetos se repiten en los gr\'aficos, estos son los 
marcados del color verde. Se realiz\'o una separaci\'on por 
cuestiones de claridad, presentando distintos aspectos de la 
soluci\'on por separado.

\begin{figure}[H]
    \centering
    \subfloat[Ingreso de Comentario]
    {\includegraphics[scale=0.60]{./imgs/ingresarComentario.pdf}}
\end{figure}


Este diagrama muestra lo que ocurre al ingresarse un comentario, en
alto nivel, con poco detalle. 
Se enfoca en la interacci\'on entre los distintos componentes del sistema,
el visual (View), representado por la interf\'az gr\'afica; 
el de moderaci\'on de un comentario en s\'i (Model), representado por el 
moderador autom\'atico, y el control entre estos dos (Controller), 
provisto por el controlador de intef\'az gr\'afica.

\begin{figure}[H]
    %\centering
    \hspace*{-1cm}
    \subfloat[Moderador Autom\'atico]
    {\includegraphics[scale=0.60]{./imgs/moderador.pdf}}
\end{figure}

Para moderar, se analiza el texto, buscando evidencias.
Las evidencias
\footnote{Llamamos evidencia a la combinaci\'on de la palabra 
original con el literal del insulto y la regla por la cual se 
lleg\'o de esa palabra al insulto.
Un ejemplo de evidencia es \{pelotudito $\rightarrow$ pelotudo 
por Diminutivo\}.}
muestran la presencia de un insulto en el comentario. 
Como se ver\'a en un siguiente diagrama, esta b\'usqueda depende 
en parte de la estretegia.

Para poder detectar diferentes tipos de insultos, hace falta
tener en cuenta la configuraci\'on
\footnote{Llamamos configuraci\'on a un conjunto de tipos de 
insultos a detectar. 
Un ejemplo de una configuraci\'on es \{literales, con espacios, 
diminutivos\}.}

\begin{figure}[H]
    \centering
    %\hspace*{-1cm}
    \subfloat[Creador De Estrategias]
    {\includegraphics[scale=0.60]{./imgs/creadorDeEstrategias.pdf}}
\end{figure}

Este diagrama muestra c\'omo se crea una estretegia 
\footnote{Llamamos estrategia a la secuencia de acciones a ser 
realizadas para detectar insultos. 
Estas acciones incluyen tratar el texto del comentario.}
diferente seg\'un la configuraci\'on.
Si hay que detectar insultos separados por letras, se utiliza el 
aplanador y detector de palabras de longitud igual a 1 (lo que 
consideramos una letra, teniendo en cuenta que no sea un caracter
especial).
Si, en cambio, hay que detectar insultos que pueden tener espacios en 
el medio o est\'an pegados a otras palabras, se utiliza el aplanador. 
De esta manera se tiene el texto del comentario todo junto, sin espacios.
%en el cual los insultos se buscar\'an luego como substrings.
Para todos los dem\'as casos se utiliza el tokenizador, que lo 
que hace es tomar como input un texto y devolver una colecci\'on 
de tokens, representando las palabras de ese texto.

\begin{figure}[H]
    \centering
    %\hspace*{-1cm}
    \subfloat[Administrador De Detectores De Tipos De Insultos]
    {\includegraphics[scale=0.60]{./imgs/administradorDeDetectoresDeTipos.pdf}}
\end{figure}

El administrador utiliza a los detectores correspondientes seg\'un la
configuraci\'on.

\begin{figure}[H]
    \centering
    %\hspace*{-1cm}
    \subfloat[Detectores]
    {\includegraphics[scale=0.60]{./imgs/detectores.pdf}}
\end{figure}

%\textbf{This isn't even my final form}

Los detectores se dividen en 4 grupos. 
Uno es el de insultos literales que lo \'unico que necesita es 
saber los insultos. 
Otro es el de insultos pegados, que buscar\'a los insultos 
como substring dento de un texto.
Para las combinaciones, se combinan los tipos de insultos configurados.
Para todo lo dem\'as, se usa un detector de tipo de insulto 
configurado, como por ejemplo diminutivos, que aplica las reglas que obtiene de un archivo.
En distintos archivos de texto mantenemos los literales y las reglas
de transformaci\'on.
\footnote{llamamos regla de transformaci\'on a un par de strings
de la forma -string1 +string2, representando que el string1 se saca
y se reemplaza por el string2.
Por ejemplo, para diminutivo una regla es \texttt{-ito +o}
para transformar una palabra con sufijo ito a una con sufijo o.}

\newpage
\subsection{Justificaci\'on}

Propusimos una interfaz gráfica responsable de poder capturar 
un comentario ingresado en un campo de texto (colaborador 
interno de la misma) y poder relevarle la tarea de procesarlo al Controlador.
El controlador tiene la responsabilidad de enviar a administrar un comentario proveniente de la interfaz gráfica. También es responsable de ``avisarle'' a la Interfaz gráfica el resultado de un análisis.
La Interfaz mostrará una notificación según el resultado que le diga el controlador, para ello le envía un mensaje a su colaborador interno : Notificación de comentario analizado.
Nos pareció correcto que la responsabilidad de recibir un resultado y mostrar una notificación era una doble responsabilidad que no debía recaer en la Interfaz, es por esto que se incorporó al Controlador de Interfaz como intermediario.\\
 
Así también, no nos pareció que el controlador debiera conocer al Moderador Automatico directamente, ya que lo que iba a pasar como parámetro para su análisis era un comentario, se incluyó un Administrador de Comentarios para este fin. Más aún, el Administrador de Comentarios podría realizar otras acciones con un comentario si en un futuro se decide cambiar la funcionalidad o incorporar una nueva. \\

Finalmente el comentario llega al Moderador Automático. Este último no puede tomar una decisión, tiene la responsabilidad de enviarlo a analizar, para ello incluímos al Analizador.
El Analizador por su parte necesita contar con evidencias para dar un veredicto sobre el comentario, por ende conocer a un Constructor de evidencias que armará las evidencias para el comentario según las que se basará para tomar una decisión.
El Constructor de evidencias solo tiene la responsabilidad de armar las evidencias para pasarselas al Analizador, primero necesita justamente las evidencias, pero para eso conoce a un Buscador de evidencias que le proveerá las evidencias que necesita.
El buscador de evidencias no puede atacar el problema directamente, para ello le deriva el comentario al Analizador de estrategias para que decida una estrategia a implementar para detectar los insultos que pueda contener el comentario y así poder colaborar con el Buscador.

El Analizador decide una estrategia a implementar en base a los que le diga el Lector de archivo de configuración. Este último tiene como única responsabilidad leer el archivo de configuración y devolver lo leido a quien le envió el mensaje (en este caso al Analizador para que tome una decisión).
El analizador decide entonces una estrategia a implementar en base a la configuración obtenida, y le deriva al Creador de estrategias la responsabilidad de crearla.
El Creador de estrategias crea la estrategia pedida. Una Estrategia conoce al Tokenizador, Aplanador de comentarios u Aplanador de palabras con long =1  según que tipo de estrategia sea (p.e: Si es una estrategia para un comentario para el que no se van a detectar insultos pegados ni separados por espacios, como es nuestro caso,solo conocerá al tokenizador). Esto último es bastante importante ya que cuando una estrategia sea ejecutada, la instancia de la misma sabrá que hacer con el comentario dependiendo de los objetos que conozca (p.e: En nuestro caso cuando se la ejecute solo le pedirá al Tokenizador que tokenize el comentario). Un detalle es que el Aplanador de palabras con long = 1 conoce a su vez a un Detector para obtener estas palabras y luego, solo tiene la responsabilidad de aplanar las palabras detectadas.
Una vez que el Analizador de estrategias obtiene la estrategia creada por el Creador, la envía a ejecutar (vía Ejecutor de estrategias) , como dijimos antes la estrategia conoce al tokenizador, aplanador segun corresponda y se ejecuta.
Luego de ejecutada la estrategia, se envían el/los "resultados" de los comentarios como consecuencia de ejecutarla (comentario tokenizado,aplanado o aplanado para las palabras con long = 1) al Administrador de detectores de Insultos. \\
Este último tendrá la ardua responsabilidad de informar todos los insultos detectados... o no tan ardua, porque para cumplir con esta responsabilidad cuenta con varios detectores de insultos diferentes con los que colaborar que le facilitarán el trabajo.\\

El Administrador primero hace uso del Lector correspondiente para obtener nuevamente la configuración actual y saber a que Detectores de Insultos debe pedirles que colaboren con él.También para pasarle la configuración al Detector de combinaciones, esto será importante más adelante.
Propusimos cuatro tipos de Detectores: Detector de combinaciones de insultos, Detector de insultos literales, Detector de insultos pegados, Detector de todos los otros tipos de insultos (peyorativos,disminutivos,aumentativos,etc).\\

El detector de literales compara si alguna palabra del comentario 
parseado pasado como par\'ametro, se corresponde con un literal. 
Para ello, conoce al lector de archivos y puede pedirle que obtenga 
los literales del archivo correspondiente.\\

El detector de insultos pegados recibe comentarios ya aplanados 
(por su estrategia correspondiente) y releva su tarea a un detector de 
substrings. 
\'Este realiza el trabajo de buscar si existen substrings con 
insultos literales en el comentario recibido. 
Para esto, conoce al lector pudiendo de esta manera saber cu\'aales 
son los insultos literales que tiene que buscar.\\

El detector de un tipo de insultos
\footnote{Para los tipos que consideramos combinaciones, que son
todos menos pegados, separados en letras y partido}
le pide al aplicador de reglas que aplique las diferentes reglas del 
tipo determinado a un comentario ``parseado'',
%(tokenizado o con palabras con long = 1 aplanadas) 
pas\'andole los literales. 
Esto lo hace para que el aplicador sepa cuando dejar de aplicar las 
reglas. 
Los literales los obtiene, envi\'andole el mensaje correspondiente 
al Lector de archivos.
Notar que esta distinci\'on fue necesaria, no s\'olo para poder 
dividir el problema y atacar sus partes por separado, sino tambi\'en 
porque cada detector funciona en base a una estrategia aplicada 
anteriormente.\\

El aplicador de reglas, primero debe conocer que reglas debe aplicar 
para llegar a los literales que le indicaron. 
Entonces, le pide al buscador de reglas las reglas correspondientes 
al tipo de insulto buscado (por ejemplo, de diminutivos). 
El buscador conoce al Lector, quien le facilita las reglas a ser 
aplicadas para el tipo de insulto buscado. 
El Buscador de reglas es puramente un intermediario, pero nos pareci\'o 
correcto que en \'el recayera la responsabilidad de obtener las reglas, 
y no directamente en el Aplicador. 
El Aplicador debería ocuparse puramente de aplicar ciertas reglas 
ya dadas.\\
 
Por \'ultimo, el detector de combinaciones, funciona como un conjunto 
de los detectores que mencionamos. 
Para poder detectar las combinaciones, le releva a un Combinador de 
tipos de insultos configurados la configuración, para que sepa qu\'e 
tipos debe combinar y el comentario.
La configuraci\'on es la que le hab\'ia pasado anteriormente el 
Administrador de detectores de Insultos.
Nos pareci\'o correcto que el detector de combinaciones no fuera 
puramente responsable de realizar todas las combinaciones, sino 
que existiera un objeto combinador que realice el trabajo. 
Para ello, el combinador de tipos de insultos conoce a todos los 
aplicadores de reglas. 
Seg\'un la configuración pasada como par\'ametro, invoca a los 
aplicadores correspondientes para que apliquen sus reglas, y as\'i 
poder reconocer combinaciones de insultos.\\
 
Una vez que los detectores detectan insultos, devuelven lo encontrado 
a su invocador (el Administrador de detectores), y \'este a la vez, 
a su invocador. Esto continua hasta que el Constructor de evidencias 
pueda efectivamente construir la evidencia, para que el Analizador 
pueda dar su veredicto. 
El Moderador Autom\'atico informa este resultado al Controlador de la 
Interf\'az Gr\'afica, quien finalmente env\'ia un mensaje a la 
interfaz para que muestre una leyenda con el mismo. 
Para esto, es importante que el controlador conozca a la Interf\'az, y 
no alcanza con que s\'olo que la Interfaz conozca al controlador.
Esto se debe a que la interf\'az, una vez que pasa el comentario 
inicial, no hace nada hasta que alguien le env\'ie un mensaje diciendo 
que m\'as debe hacer.

%\newpage
%\subsection{Diagramas de Secuencia}
%
%Se presenta la secuencia realizada en el caso de ingresarse un 
%comentario no publicable.
%
%\begin{figure}[H]
    %\centering
    %\hspace*{-1.2cm}
    %\subfloat[]
    %{\includegraphics[scale=0.55]{./imgs/seq-01.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering
    %\hspace*{-1.2cm}
    %\subfloat[]
    %{\includegraphics[scale=0.48]{./imgs/seq-02.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering    
    %\subfloat[]
    %{\includegraphics[scale=0.55]{./imgs/seq-03.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering
    %\hspace*{-1cm}
    %\subfloat[]
    %{\includegraphics[scale=0.50]{./imgs/seq-04.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering    
    %\subfloat[]
    %{\includegraphics[scale=0.60]{./imgs/seq-05.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering
    %\hspace*{-1cm}
    %\subfloat[]
    %{\includegraphics[scale=0.50]{./imgs/seq-06.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering
    %\subfloat[]
    %{\includegraphics[scale=0.60]{./imgs/seq-07.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering
    %\hspace*{-1.2cm}
    %\subfloat[]
    %{\includegraphics[scale=0.48]{./imgs/seq-08.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering
    %\hspace*{-1.2cm}
    %\subfloat[]
    %{\includegraphics[scale=0.47]{./imgs/seq-09.pdf}}
%\end{figure}
%
%\begin{figure}[H]
    %\centering
    %\hspace*{-1.2cm}
    %\subfloat[]
    %{\includegraphics[scale=0.47]{./imgs/seq-10.pdf}}
%\end{figure}
